extends Node

var tables_queries = preload("res://data/table_queries.gd").new()
#используемая либа: https://github.com/2shady4u/godot-sqlite?tab=readme-ov-file

@onready var database := SQLite.new()

# Called when the node enters the scene tree for the first time.
func _ready():
	pass
	#var dir = DirAccess.dir_exists_absolute()
	#if not DirAccess.dir_exists_absolute(database_path):
		#DirAccess.make_dir_absolute(database_path)
	#database.path = str(database_path,"/data.db")
	#database.open_db()

#признаком успешного создания станет наличие "текущего" каталога
func new_catalog() -> bool:
	ENV.open_file_window(create_catalog, PackedStringArray(["*.catalog"]), FileDialog.FILE_MODE_SAVE_FILE)
	
	return not ENV.current_catalog_path.is_empty()

func open_catalog(catalog_path : String = ENV.current_catalog_path) -> bool:
	database.close_db()
	database.path = catalog_path
	if not database.open_db():
		print("WARN: CANNOT OPEN NEW CATALOG DB!")
		return false
	return true

func close_catalog() -> bool:
	return database.close_db()

func create_catalog(new_catalog_path : String):
	if not open_catalog(new_catalog_path):
		return

	var is_init_ok : bool = true
	for table_key in tables_queries.tables_init_list:
		if database.query(tables_queries.tables_init_list[table_key]):
			print("Init table ", table_key, " --- SUCCESS.")
		else:
			print("Init table ", table_key, " --- ERROR!")
			is_init_ok = false
	if is_init_ok:
		print(" ---- ALL TABLES ARE SUCCESS INIT ---- ")
	ENV.current_catalog_path = new_catalog_path

func get_catalog_info() -> Dictionary:
	if ENV.current_catalog_path.is_empty():
		print("ERR: catalog is not open.")
		return {}
	print("INF: open catalog ", ENV.current_catalog_path)
	var result = database.select_rows("catalog_info", "", ["*"]) as Array
	return result.front() if not result.is_empty() else {};

func is_category_exests_by_alias(alias : String) -> bool:
	var result = database.select_rows("unit_type", str("alias = ", alias), ["*"]) as Array
	return not result.is_empty()

func append_catalog_info(new_catalog_data : Dictionary) -> bool:
	print("DEB: append_catalog_info")
# принимает идентификатор прототипа упражнения (таба exercises)
# создаёт новую запись экземпляра упражнения и возвращает её ид
#func new_exercise_instance(exec_id:int) -> int:
	if get_catalog_info().is_empty() and not new_catalog_data.is_empty():
		print("DEB: new catalog info")
		database.insert_row("catalog_info", new_catalog_data)
		return true
	elif new_catalog_data.has("alias"):
		print("DEB: upd catalog info")
		database.update_rows("catalog_info", str("alias = \"", new_catalog_data["alias"], "\""), new_catalog_data)
		return true
	else:
		print("WRN: new_catalog_data is empty: ", new_catalog_data)
	return false

#получить список типов для которых тип с идентификатором, переданным в качестве
#аргумента является родительским
#по-умолчанию, берём те категории, которые условно не имеют родителя 
#(родительский ид = -1) 
func get_categories_list_by_id(id:int = -1)-> Array:
	print("INF: get child categories of category ", id)
	var sellect_querry = ""
	sellect_querry = str("parent_type_id = ", id)
	var result = database.select_rows("unit_type", sellect_querry, ["*"]) as Array
	return result

#получения списка прототипов параметров по идентификатору прототипа упражнения
#func get_exercises_properties_by_exec_id(exec_id:int) -> Array:
	#var result = database.select_rows("exercises_properties", str("exercise_id = ", exec_id), [ANYVALUE]) as Array
	#return result;

#получить список всех идентификаторов катерогороий
func get_all_categories_decimal_id_list()-> Array:
	print("INF: get all categories decimal_ids list ")
#если сюда прилетел -1, то заменяем ид на нулл и с ним селлектим
#таба допускает наличие пустых полей, если у типа пустое поле
#родительского типа, то значит, что он корневой
	var result = database.select_rows("unit_type", "", ["decimal_id"]) as Array
	return result

func append_category(category : Dictionary) -> bool:
	print("DEB: append_category")
	if not category.has("alias"):
		print("ERR: category not have alias")
		return false
# принимает идентификатор прототипа упражнения (таба exercises)
# создаёт новую запись экземпляра упражнения и возвращает её ид
	if not (is_category_exests_by_alias(category["alias"]) and category.is_empty()):
		print("DEB: new category ", category)
		#database.query(str("INSERT INTO unit_type 
			#(alias, parent_type_id, description) 
			#VALUES (",
				#quoted(category["alias"]),",",
				#quoted(str(category["parent_type_id"])),",",
				#quoted(category["description"])
			#,")"))
		database.insert_row("unit_type", category)
		return database.last_insert_rowid != 0
	elif category.has("alias"):
		print("DEB: upd category")
		database.update_rows("unit_type", str("alias = \"", category["alias"], "\""), category)
		return database.last_insert_rowid != 0
	else:
		print("WRN: category is empty: ", category)
	return false

func get_category_id_by_decimal_number(dec_num : int) -> int:
	print("INF: open catalog ", ENV.current_catalog_path)
	var result = database.select_rows("unit_type", str("decimal_id = ", dec_num), ["id"]) as Array
	return result.front()["id"] if not result.is_empty() and result.front().has("id") else {};

func quoted(string : String) -> String:
	return str("\"", string, "\"")
